/**
 * axios封装
 * 请求拦截、响应拦截、错误统一处理
 */
import axios from "axios";
import { Message } from "element-ui"; // 单独引入elementUI的消息提示框组件
import router from "@/router";
import store from "@/store";
import { quitFun } from "@/util/quit";
//import nprogress from 'nprogress'; // progress bar
//import 'nprogress/nprogress.css';// progress bar style
// nprogress.configure({ showSpinner: false })// NProgress Configuration
/**
 * 提示函数
 * 禁止点击蒙层、显示一秒后关闭
 */
const tip = (msg, type) => {
  Message({
    message: msg,
    type: type,
  });
};

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
  // 状态码判断
  switch (status) {
    // 401: 登录超时，跳转登录页
    case 401:
      tip("登录超时，请重新登录", "error");
      setTimeout(() => {
        quitFun();
      }, 1000);
      break;
    // 404请求不存在
    case 404:
      tip("请求的资源不存在", "error");
      break;
    case 409:
      break;
    case 499:
      console.log("第三方登录接口报错，不提示文本");
      break;
    default:
      if (other) {
        tip(other, "warning");
      }
  }
};
// 创建axios实例
var instance = axios.create({ timeout: 1000 * 30 });
// 设置请求头
instance.defaults.headers.post["Content-Type"] = "application/json; charset=UTF-8";
// instance.defaults.headers.post['content-Type'] = 'application/x-www-form-urlencoded'
if (store.state.common.uif) {
  instance.defaults.headers["Authorization"] = store.state.common.uif;
}
instance.defaults.headers["Access-Control-Allow-Origin"] = "*";
// instance.defaults.headers["X-Real-IP"] = sessionStorage.getItem("cityjson_cip");

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
  (config) => {
    //nprogress.start(); // 进度条开始
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    // const token = store.state.token
    // token && (config.headers.Authorization = token)
    return config;
  },
  (error) => Promise.error(error)
);

// 响应拦截器
instance.interceptors.response.use(
  // 请求成功
  (res) => {
    //nprogress.done(); // 进度条结束
    let responseCode = res.data.status || res.data.Status;
    if (responseCode != 200 && responseCode != "200" && responseCode != "204" && responseCode != "201" && responseCode != "424" ) {
      errorHandle(res.data.status, res.data.message);
    }
    return Promise.resolve(res);
  },
  // 请求失败
  (error) => {
    // nprogress.done() // 进度条结束
    const { response } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围
      if (response.data.status != "424") {
        errorHandle(response.status, response.data.message);
      }
      return Promise.reject(response);
    } else {
      // 处理断网的情况
      // eg:请求超时或断网时，更新state的network状态
      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
      // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
      if (error.message.includes("timeout")) {
        tip("请求超时，请稍后", "error");
        return Promise.reject(error);
      } else if (!window.navigator.onLine) {
        tip("您的网络不稳定，请检查网络", "error");
        return Promise.reject(error);
      } else {
        return Promise.reject(error);
      }
    }
  }
);

export default instance;
